// utils/storage.ts

/**
 * LocalStorage 封装工具类
 * 提供类型安全的 localStorage 操作方法
 */
class StorageUtil {
  /**
   * 存储数据
   * @param key 存储键名
   * @param value 存储值
   * @param options 配置选项
   */
  static set<T>(key: string, value: T, options?: { expires?: number }): void {
    if (typeof window === 'undefined') return;
    try {
      const storageData = {
        value,
        _timestamp: Date.now(),
        _expires: options?.expires,
      };
      localStorage.setItem(key, JSON.stringify(storageData));
    } catch (error) {
      console.error('LocalStorage set error:', error);
      throw new Error('LocalStorage is not available');
    }
  }

  /**
   * 获取数据
   * @param key 存储键名
   * @param defaultValue 默认值（可选）
   * @returns 存储的值或默认值
   */
  static get<T>(key: string, defaultValue?: T): T | undefined {
    // 添加服务器端检查
    if (typeof window === 'undefined') return defaultValue;

    try {
      const item = localStorage.getItem(key);
      if (!item) return defaultValue;

      const parsedData = JSON.parse(item) as {
        value: T;
        _timestamp: number;
        _expires?: number;
      };

      // 检查是否过期
      if (
        parsedData._expires &&
        Date.now() > parsedData._timestamp + parsedData._expires
      ) {
        this.remove(key);
        return defaultValue;
      }

      return parsedData.value;
    } catch (error) {
      console.error('LocalStorage get error:', error);
      return defaultValue;
    }
  }
  /**
   * 删除数据
   * @param key 存储键名
   */
  static remove(key: string): void {
    localStorage.removeItem(key);
  }

  /**
   * 清空所有数据
   */
  static clear(): void {
    localStorage.clear();
  }

  /**
   * 检查是否存在某个键
   * @param key 存储键名
   */
  static has(key: string): boolean {
    return localStorage.getItem(key) !== null;
  }

  /**
   * 获取所有键名
   */
  static keys(): string[] {
    return Object.keys(localStorage);
  }

  /**
   * 获取存储的数据大小（KB）
   */
  static getSize(): number {
    let total = 0;
    for (const key in localStorage) {
      if (localStorage.hasOwnProperty(key)) {
        const item = localStorage.getItem(key);
        total += item ? item.length * 2 : 0; // 每个字符按2字节计算
      }
    }
    return total / 1024; // 转换为KB
  }
}

export default StorageUtil;